package com.thwcompany.config;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
/**
 * Created by IntelliJ IDEA2021.3
 * @Author: Tenghw
 * @Date: 2022/10/21  20:32
 * @Description:
 */
@Configuration
@SuppressWarnings("all")
public class BusinessRabbitMQConfig {
    /**
     * new DirectExchange(String name, boolean durable, boolean autoDelete, Map<String, Object> arguments)
     */
    // 创建业务直连交换机
    @Bean
    DirectExchange businessExchange() {
        return new DirectExchange("business.exchange", true, false);
    }

    /**
     * new Queue(String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
     * durable：若为true时：表示该队列是持久化的（durable）。这意味着即使RabbitMQ服务器重启，队列还是存在的。
     * autoDelete设置为true时，当消费者断开时，Broker自动删除了该队列(亲测)；当消费者恢复连接后，Broker会重新自动创建一个同名队列，并且重新绑定队列和交换机，并且恢复之前的消息。
     */
    // 创建业务消息队列
    @Bean
    Queue businessQueue1() {
        HashMap<String, Object> arguments = new HashMap<>();
        // 设置该业务消息队列的死信交换机
        arguments.put("x-dead-letter-exchange", "dead.letter.exchange");
        // 设置死信交换机绑定队列的routingKey
        arguments.put("x-dead-letter-routing-key", "dead.letter");
        // 设置队列TTL，即队列中所有消息的过期时间
        arguments.put("x-message-ttl", 10000);
        // 设置队列的最大容量
        arguments.put("x-max-length", 6);
        // 队列生存周期
        arguments.put("x-expires", 10000);
        //一般设置0到9；数字越大，优先级越高
        arguments.put("x-max-priority", 9);
        // 队列生存周期
        arguments.put("x-expires", 10000);
        // 先将消息保存到磁盘上，不放在内存中，当消费者开始消费的时候，才加载到内存中。
        arguments.put("x-queue-mode", "lazy");
        //return new Queue("business.queue1", true, false, false, arguments);
        return QueueBuilder
                .durable("business.queue1")//.NonDurable消息非持久化
                .withArguments(arguments)
                .build();
    }
    // 业务消息队列和业务交换机通过路由键绑定
    //@Bean
    //Binding businessBinding1() {
    //    return BindingBuilder.bind(businessQueue1()).to(businessExchange()).with("business1");
    //}
    @Bean
    Binding businessBinding1(@Qualifier("businessQueue1") Queue queue, @Qualifier("businessExchange") DirectExchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with("business1");
    }
}
